#ifndef __tim_hw_H
#define __tim_hw_H


#ifdef __cplusplus
extern "C" {
#endif 

#include "gd32e10x.h"


//使用外部晶体做时钟源，8M
#define Sec_div_def			2000   		//主频除以该值，计算MS使用

//因为主频超过了65MHz，定义毫秒使用下面宏定义
#define _MS( var )			(var*2)	 	//var 最大输入不能超过（65535/2）即 32秒





/*定义一个短定时器，单位是1毫秒*/
typedef struct
{
	uint8_t valid;	//

	uint32_t s;			//记录开机后走过的秒
	uint16_t s_ms;

	uint16_t Tim1msOld;
	uint16_t Tim1000msOld;
	
}tim1Ms_DataTypeDef;





/*
获取两个时间差，不要超过65秒
一般用于ms级别的精确延时
输入参数：get1msCounter
返回结果：新旧timer的毫秒差
*/
uint16_t getTim1MsElaps(uint16_t newT, uint16_t oldT);

/*
初始化1ms定时器，16位
*/
void InitTimer1MS(void);


/*
初始化1ms的变量
*/
void initTime1MsVar(void);


/*
时间变量处理
得出一个秒信号
*/
void Deal_Time(void);

//最大=0xffff,uint32_t 类型
#define get1msCounter()		timer_counter_read(TIMER1)	


/*
返回系统秒
*/
uint32_t get1sCounter(void);

extern tim1Ms_DataTypeDef	tag1Ms;
#define get1sCounter() tag1Ms.s


/*
该函数仅用于OneSecProcess函数
下面这种写法仅为了模块化，变量不外泄
并且提高程序执行效率
*/
extern tim1Ms_DataTypeDef	tag1Ms;
#define getSecFlag()	tag1Ms.valid			//获取秒状态变化
#define clearSecFlag() tag1Ms.valid=0		//清除秒状态变化


//给休眠做的定时器中断
void StartTimerForWakeup(void);
void StartLongTimerForWakeup(void);
void StopTimerForWakeup(void);

void delay(uint32_t cnt);
void initTimer68uS(void);

#ifdef __cplusplus
}
#endif


#endif



